perm filename BMX[1,LCS] blob
sn#816381 filedate 1986-05-01 generic text, type T, neo UTF8
SUBROUTINE BMX(RA)
C RA=NUMB. OF TAILS
C VQ HOLDS TEMPORARY INFO RE. MULTIPLE BEAMS.
common /XRN/RN(1) /RNW/RNW /A2Z/LAA,LBB
1 /dpymem/R(15,150),rpos(2,100),POSNT(150),RHY(100),jstdir(150)
1 ,ntptr(150)
1 /RMOD/staff,SET4,IBEAM,NOSET,STEM,JSTUP,NTC,PS2,IZ,JSTEM,
1 IRHY,POSB /ALF/INP(100) /LIMIT/LIMIT,ITEM,LL,IRN,IX
1 /mode/mode,jm,ioct,mm,nn,motend,ichd /v/kv,v(150)
COMMON E,F,G,H,RJQ(34),RB,VQX,JB,B,JV,JW /STF/RSTFAC(8),RSTJ2
1 /RNW/RNW
M=IRN-12
RX7=RN(7+M)
C ORIGINAL STEM DIR. AND NUM. OF BEAMS INFO.
DO 1 L=KN,K
B=R(7,L)
JB=B/10
B=B-JB*10
IF(R(8,L).EQ.1000.)B=0.
C AVOIDS GRACE NOTES AND NON-NOTES
CCCCC IF(R(9,L).GE.64.)B=0
C 64"+ = NEW GRACE NOTES 6/85
IF(R(4,K).GT.80.)B=0.
C GRACE NOTES CAN BE FROM 80 (=-120) TO 180
IF(R(1,L).NE.1.)B=0.
1 VQ(L)=B
VQ(K+1)=0.
C CLEARS IT FOR ROUTINE AT '3'
JB=KN
RX8=0.
JBX=0
C THE ABOVE 2 ARE FOR NEW COMPOSITE BEAM FEATURE 5/78
6 DIS=0.
RB9=0.
DO 2 L=JB,K
IF(VQ(L).LE.RA)GO TO 2
C SKIP IF EQ. TO PRESENT BEAM
RB=VQ(L)
LL=L
4 DO 11 JD=LL,K
VQX = VQ(JD)
IF(VQX.GE.RB)GO TO 20
IF(VQX.EQ.0.)GO TO 11
C VQX=0 ON NON-STEM NOTES OF CHORDS. (HENCE NO TAILS)
21 B=10.
IF(LL.GT.KN)GO TO 13
GO TO 16
20 JV=JD
IF(VQX.GT.RB)GO TO 21
11 JW=JD
B=20.
C FINDS NEED FOR BEAM TO LEFT
16 B=B+RA
IF(JBX.LT.0)GO TO 50
C FOR NEW COMPOSITE BEAM FEATURE 5/78
JE=RN(7+M)/10.
RN(7+M)=JE*10.+RA
GO TO 51
50 DO 5 JE=1,6
5 RN(JE+IRN)=RN(JE+M)
RN(7+IRN)=RX7+RB-RA*2.
C ADDS RIGHT NUM. OF BEAMS
51 IF(LL.NE.JV)GO TO 10
IF(LL.EQ.KN)GO TO 377
IF(LL.NE.K)GO TO 10
377 B=-B
C PARTIAL, UNATTACHED BEAM IS PLACED AUTOMATICALLY IN ITMSUB.
GO TO 8
13 IF(JV.GT.LL)GO TO 14
IF(R(7,LL+1).LT.10)GO TO 15
C NEXT FOR DOT ON FOLLOWING NOTE.
DIS=10.
GO TO 19
15 DIS=20.
C SHORT INNER BEAM TO LEFT OF STEM
19 B=-RA
GO TO 16
14 DIS=30.
C LONG INNER BEAM
JV=-JV
GO TO 16
C PARTIAL BEAM IS ON RIGHT(+) OR LEFT(-). RBM IS LENGTH.
10 IF(LL.EQ.KN)GO TO 22
IF(JV.GE.0)GO TO 17
B=R(3,LL)
JV=-JV
LL=JV
22 IF(VQ(JW+1).GT.VQ(JW))GO TO 17
VQ(JW)=VQ(JW+1)
JW=JW-1
17 IF(LL.NE.JB)GO TO 18
IF(B.LT.20.)LL=JV
C PUTS BEAMS IN RIGHT PLACE.
18 RC=R(10,LL)
IF(RC.EQ.0.)GO TO 23
RB=RNW*RSTJ2
IF(ABS(R(4,LL)).GE.100.)RB=RB*.6
C GET WIDTH OF NOTE(RNW) FOR DISPLACEMENT
IF(RC.EQ.2.)RB=-RB
RC=RB
23 RB9=RC+R(3,LL)
C THIS WILL BE POS.3
DIS=RA+DIS
C DISPLACES
GO TO 8
2 CONTINUE
RETURN
8 JB=JW+1
C FINDS SIDE (L,R) FOR PARTIAL BEAM
C FOR NEW DISPLACEMENT
RN(IRN+11)=-1.
IF(RB9+DIS.EQ.0.)GO TO 31
IF(DIS.LT.10.)GO TO 32
IF(DIS.LT.30.)GO TO 33
C INNER PARTIAL BEAM IS NEXT
DIS=DIS-30.
GO TO 31
32 IF(B.GE.20.)GO TO 12
DIS=B-10.
B=-1.
C -1 PICKS UP POS OF P3
GO TO 31
12 DIS=B-20.
B=RB9
RB9=-1.
C -1 IN P9 WILL PICK UP POS OF P6
C INNER BEAM ATTACHED TO LFT SIDE.
GO TO 31
33 B=-DIS
DIS=0.
31 L=IS
IF(JBX.LT.0)GO TO 53
L=M
C CHANGED 5/84 FOR NEG P10 FOR COMPOSITES DIS=(RB-RA)*100.+1.
DIS=-(RB-RA)*100.
53 IF(RX8.GT.1.)GO TO 52
IF(RB9.NE.0.)GO TO 52
IF(RX8.NE.0.)GO TO 54
RX8=B
GO TO 52
54 RN(8+M)=-30.
C TWO UNATTACHED BEAMS, LEFT AND RIGHT
RX8=1.
GO TO 55
52 RN(8+L)=B
RN(9+L)=RB9
RN(10+L)=DIS
IF(JBX.LT.0)CALL UPDATE(9)
C ADDED ANOTHER ITEM (PART. BEAM)
JBX=-1
JA=0
55 IF(JB.LE.K)GO TO 6
END
subroutine bauto(j,l,k,n)
common /v/kv,v(150)
j=j+2
ll=l-n
kk=k-n
v(j-1)=ll
end
subroutine update(i)
common /XRN/RN(1) /LIMIT/LIMIT,ITEM,LL,IRN,IX
rn(irn)=i
irn=irn+i
c i=wd cnt of this item. Use with BEAMZ and SLURZ.
end
subroutine stupdn(jstm,n,rnum,a,np,hgt,grc)
c jstm=stem dir, n=note num, rnum=num over beam, a=note num, np=pointer
c hgt=height of note, grc=grace note?
common /dpymem/R(15,150),rpos(2,100),POSNT(150),RHY(100)
1 ,jstdir(150),ntptr(150)
k=a
n=iabs(mod(k,1000))
c the note number
m=jstdir(n)
if(m.ge.0)go to 1
jstm=-m
c get the stem direction if it was set because of chord setup
go to 2
1 jstm=m
c get stem direction from NOTEIN if it was specified
if(k.lt.0)jstm=20
c neg. value in current input makes stem down
if(k.gt.1000)jstm=10
c >1000 in input forces stem up
2 rnum=10.*abs(amod(a,1.))
c for number over beam -- 12.3 or -5.3, etc. produces a 3
np=ntptr(n)
c pointer to note in R array
c check for chord
nx=np
4 if(r(1,nx+1).ne.1.)go to 3
c next not a note, hence no chord
if(r(7,nx+1).ne.0.)go to 3
c has rhythm, not a chord
nx=nx+1
c go back for more chord notes
go to 4
3 h=r(4,nx)
c get note height
hgt=h
grc=0.
if(abs(h).lt.100.)return
c found grace note
grc=1.
hh=100.
if(h.lt.0.)hh=-hh
hgt=h-hh
end
**** next could be inside of BEAMIN
subroutine bmpts(n1,n2,m)
c n1,n2 point to start and end of this beam (ntptr array)
c jtail holds how many tails on each note in beam area
common /dpymem/R(15,150),rpos(2,100),POSNT(150),RHY(100)
1 ,jstdir(150),ntptr(150)
c use rpos and posnt areas??? for jbmnt(m), jtail(m)
m=0
do 1 k=n1,n2
m=m+1
l=ntptr(k)
jtail(m)=amod(r(9,l),10.)
1 jbmnt(m)=l
end